#include<iostream>

using namespace std;
const int N=5e4+10;

struct node
{
	int f,w;
}ufs[N];

int find(int x)
{
	if(ufs[x].f==x)
	{
		return x;
	}
	int f=ufs[x].f;
	ufs[x].f=find(f);
	ufs[x].w=(ufs[x].w+ufs[f].w)%3;
	return ufs[x].f;
}

void un(int x,int y,int w)
{
	int fx=find(x);int fy=find(y);
	if(fx==fy) return;
	ufs[fy].f=fx;

	ufs[fy].w=(-ufs[y].w+ufs[x].w+w+9)%3;
}

int quary(int x,int y)
{
	int fx=find(x);
	int fy=find(y);

	if(fx!=fy) return -1;
	return (ufs[y].w-ufs[x].w+3)%3;
}

bool istrue(int n)
{
	int w,x,y;cin>>w>>x>>y;

	if(x>n||y>n) return false;
	if(quary(x,y)==-1)
	{
		un(x,y,w-1);
	}
	else if(quary(x,y)!=(w-1))
	{
		return false;
	}

	return true;

}
int main()
{
	int n,m;cin>>n>>m;

	for(int i=1;i<=n;i++)
	{
		ufs[i].f=i;
		ufs[i].w=0;
	}

	int ret=0;
	for(int i=1;i<=m;i++)
	{
		if(!istrue(n))
		{
			ret++;
		}
	}
	cout<<ret<<endl;
}